import logging

import pytest

"""
封装Assert，提供断言失败或成功的备注
"""


class CustomAssert:

    def __init__(self):
        self.errors = []  # 将 errors 变为实例变量

    def custom_assert(
            self,
            condition,
            *,  # 强制后续参数必须用关键字传递
            success_message="断言成功",
            failure_message="断言失败"
    ):
        """
        封装断言
        :param condition:
        :param success_message:
        :param failure_message:
        :return:
        """
        try:
            assert condition
            logging.info(f"断言成功：{success_message}")
        except AssertionError:
            self.errors.append(failure_message)
            logging.error(f"断言失败：{failure_message}")

    def errors_nums(self):
        """
        原因是 pytest在断言时候后，该方法的后续断言不再执行
        所以我将一个方法内的失败断言都捕获到list中，方法结束时判断list是否为空
        非空就通知pytest测试失败
        :return:
        """

        if len(self.errors) != 0:
            # logging.error(f"失败的断言：{self.errors}")
            self.errors.clear()
            pytest.fail("手动通知 pytest 测试失败")


instance = CustomAssert()


def get_instance():
    return instance
